"""
计算部门的人效比
人效比=有效工时（扣除请假）/填日报人数/月标准工时
1,2,3月人效比分别为1.04、0.97和1.04
"""

import pandas as pd
from CommonBase import get_file_content_byPath

# 获取数据并进行预处理
def get_all_data(path,type='csv'):

    # 调用方法获取路径内的所有数据
    file_content = get_file_content_byPath(path,type)

    file_content['月份'] = file_content['日报时间'].apply(lambda x: x[:4] + x[5:7])

    # 读取每月的实际工作天数
    path = './Files/workLoad/2024年法定工作日.xlsx'
    file_workday = pd.read_excel(path)
    file_workday['月份'] = file_workday['月份'].astype(str)

    # 将file_content与file_workday合并，分别使用“用户”和“姓名”列关联
    file_content = pd.merge(file_content, file_workday, on='月份')

    # 读取人员与角色对应表
    path = './Files/workLoad/人员配置.xlsx'
    file_person = pd.read_excel(path)
    # “用户”列的内容中，中间存在空格，需要去掉
    file_person['用户'] = file_person['用户'].str.replace(' ', '')
    file_person['员工'] = file_person['用户']

    # 将file_content与file_person合并，分别使用“用户”和“姓名”列关联，采用左连接
    file_content = pd.merge(file_content, file_person, on='员工',how='left')

    #如果岗位角色为空，则设置成“其他”。原因：1.人员离职，不在部门编制表；2.外部门协同工作人员
    file_content['岗位角色'] = file_content['岗位角色'].fillna('其他')

    #将“岗位角色”等于其他的数据过滤掉
    file_content = file_content[file_content['岗位角色'] != '其他']

    #file_content只保留日期为2024年1月1日之后的数据
    file_content = file_content[file_content['日报时间'] >= '2024-01-01']

    # file_content中将“分类一”等于“请假”的内容过滤掉
    file_content = file_content[file_content['分类一'] != '请假']

    #只保留'月份','小时','用户','法定工作日','岗位角色'列
    file_content = file_content[['月份','工作时间','员工','法定工作日','岗位角色']]

    return file_content

# 获取数据并进行预处理
# 只处理24年1~3月份的数据
def get_all_data_temp(path,type='csv'):

    # 调用方法获取路径内的所有数据
    file_content = get_file_content_byPath(path,type)

    file_content['月份'] = file_content['日期'].apply(lambda x: x[:4] + x[5:7])

    # 读取每月的实际工作天数
    path = './Files/workLoad/2024年法定工作日.xlsx'
    file_workday = pd.read_excel(path)
    file_workday['月份'] = file_workday['月份'].astype(str)

    # 将file_content与file_workday合并，
    file_content = pd.merge(file_content, file_workday, on='月份')

    # 读取人员与角色对应表
    path = './Files/workLoad/人员配置.xlsx'
    file_person = pd.read_excel(path)

    # 将file_content与file_person合并，分别使用“员工”列关联，采用左连接
    file_content = pd.merge(file_content, file_person, on='用户',how='left')

    #如果岗位角色为空，则设置成“其他”。原因：1.人员离职，不在部门编制表；2.外部门协同工作人员
    file_content['岗位角色'] = file_content['岗位角色'].fillna('其他')

    #将“岗位角色”等于其他的数据过滤掉
    file_content = file_content[file_content['岗位角色'] != '其他']

    #file_content只保留日期为2024年1月~3月的数据
    file_content = file_content[file_content['月份'].isin(['202401', '202402', '202403'])]

    #只保留'月份','小时','用户','法定工作日','岗位角色'列
    file_content = file_content[['月份','小时','用户','法定工作日','岗位角色','项目']]

    file_content.to_excel('E:/工作文件/运营管理部 项目指标/工作量/数据/24年1~3月原始数据.xlsx')

    return file_content

# 进行逻辑运算
def cal_data(df):

    """
    计算部门总的人效比
    """
    df_month = df.groupby(['月份','法定工作日'])['工作时间'].sum()
    df_month = df_month.reset_index()

    # 按月份计算每月填写日报的去重人数
    df_person = df.groupby(['月份'])['员工'].nunique()
    df_person = df_person.reset_index()

    # 将df_month和df_person按“月份”合并
    df_merge = pd.merge(df_month,df_person,on='月份')
    df_merge = df_merge.reset_index()

    df_merge['负荷度'] = df_merge['工作时间'] / (df_merge['员工'] * df_merge['法定工作日'] * 8)

    print(df_merge)

def cal_data_by_group(df):

    """
    按组别计算人效比
    """
    df_month_type = df.groupby(['月份','法定工作日','岗位角色'])['工作时间'].sum()
    df_month_type = df_month_type.reset_index()

    # 按月份和岗位角色计算每月填写日报的去重人数
    df_person_type = df.groupby(['月份','岗位角色'])['员工'].nunique()
    df_person_type = df_person_type.reset_index()

    # 将df_month和df_person_type按“月份”合并
    df_merge_type = pd.merge(df_month_type,df_person_type,on=['月份','岗位角色'])
    df_merge_type = df_merge_type.reset_index()

    df_merge_type['负荷度'] = df_merge_type['工作时间'] / (df_merge_type['员工'] * df_merge_type['法定工作日'] * 8)

    # 将df_merge_type转成交叉报表，以“岗位角色”为行索引，以“月份”为列索引，以“负荷度”为值
    df_pivot = df_merge_type.pivot(index='岗位角色', columns='月份', values='负荷度')

    print(df_pivot)

def cal_data_by_person(df):

    """
    计算个人的人效比
    """
    df_month_type = df.groupby(['月份','法定工作日','员工'])['工作时间'].sum()
    df_month_type = df_month_type.reset_index()

    df_month_type['负荷度'] = df_month_type['工作时间'] / (df_month_type['法定工作日'] * 8)

    # 将df_merge_type转成交叉报表，以“岗位角色”为行索引，以“月份”为列索引，以“负荷度”为值
    df_pivot = df_month_type.pivot(index='员工', columns='月份', values='负荷度')

    # 将df_pivot中的数据，按月分组后，分别保存至同一个Excel中的不同sheet中
    writer = pd.ExcelWriter('E:/工作文件/运营管理部 项目指标/工作量/项目管理统计/个人人效比.xlsx')
    for i in df_pivot.columns:
        # 将df_pivot中的数据，按“符合度”降序排列
        df_pivot[[i]].sort_values(by=i,ascending=False).to_excel(writer, sheet_name=str(i))
    writer._save()

def cal_data_by_group_temp(df):

    """
    按组别计算人效比
    """
    df_month_type = df.groupby(['月份','法定工作日','岗位角色'])['小时'].sum()
    df_month_type = df_month_type.reset_index()

    # 按月份和岗位角色计算每月填写日报的去重人数
    df_person_type = df.groupby(['月份','岗位角色'])['用户'].nunique()
    df_person_type = df_person_type.reset_index()

    # 将df_month和df_person_type按“月份”合并
    df_merge_type = pd.merge(df_month_type,df_person_type,on=['月份','岗位角色'])
    df_merge_type = df_merge_type.reset_index()

    df_merge_type['负荷度'] = df_merge_type['小时'] / (df_merge_type['用户'] * df_merge_type['法定工作日'] * 8)

    # 将df_merge_type转成交叉报表，以“岗位角色”为行索引，以“月份”为列索引，以“负荷度”为值
    df_pivot = df_merge_type.pivot(index='岗位角色', columns='月份', values='负荷度')

    print(df_pivot)

# 定义数据文件的路径
path = 'E:/工作文件/运营管理部 项目指标/工作量/全量数据/'

# 获取数据
# 数据来源：安全与质量部 数据管理平台
file_content = get_all_data(path,'xlsx')

# 计算部门总的人效比
cal_data(file_content)

# 按组别计算部门人效比
cal_data_by_group(file_content)

# 计算个人的人效比
cal_data_by_person(file_content)

"""
以下代码临时计算24年1~3月份的人效比
数据来源：Redmine
"""
# # 定义数据文件的路径
# path = 'E:/工作文件/运营管理部 项目指标/工作量/数据/'

# # 获取数据
# file_content = get_all_data_temp(path)

# # 按组别计算部门人效比
# cal_data_by_group_temp(file_content)